查看原文
其他

Pulsar IO 中 Schema 的调用流程

tuteng StreamNative 2021-10-18


🎙️阅读本文需要 4 分钟



Pulsar Connector 系列的前几篇文章已介绍了 Source、Sink 与 Producer、Consumer 的关系。内建的 Source 封装了 Consumer、内建的 Sink 封装了 Producer,因此,Source 与 Sink 是对 pub/sub 模式的一个深层次的应用。

Pulsar 在与其他系统集成时,Schema 帮助 Pulsar 保留了数据在其他系统中原有的含义。例如,数据库中表的各个字段和信息都可以通过 Schema 表达。

Schema 的内容比较多,本文简单介绍 Source、Sink 与 Schema 的关系;其他部分,例如:Schema 的版本、注册中心和兼容性等会在之后的文章中介绍。


Schema 是一种描述数据的数据。例如,数据库中表的信息和字段类型等都是 Schema。Pulsar 对 Schema 也有比较好的支持。

>>> Schema 简单应用 <<<

在使用 pub/sub 生产和消费消息时,可以通过以下代码使用 Schema:
public class SensorReading { public float temperature;
public SensorReading(float temperature) { this.temperature = temperature; }
// A no-arg constructor is required public SensorReading() { }
public float getTemperature() { return temperature; }
public void setTemperature(float temperature) { this.temperature = temperature; }}Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class)) .topic("my-topic") .create();Consumer consumer = client.newConsumer(JSONSchema.of(SensorReading.class)) .topic("my-topic") .subscriptionName("my-subscription")        .subscribe();


通过以上操作,生产者和消费者可以识别出关于 SensorReading 这个类的含义。这是 Schema 在客户端的应用,也是比较普遍的使用方法。

前文已经提到,Source 和 Sink 是对 pub/sub 的封装,因此,Schema 的应用也是基于以上原理。以下为详细说明。

>>> Source 中的 Schema <<<

在内建的 Sink 中,实现了一个 Consumer,用于接收从 Pulsar 发来的数据。
if (conf.getSerdeClassName() != null && !conf.getSerdeClassName().isEmpty()) { schema = (Schema<T>) topicSchema.getSchema(topic, typeArg, conf.getSerdeClassName(), true);} else { schema = (Schema<T>) topicSchema.getSchema(topic, typeArg, conf.getSchemaType(), true);}


getSerdeClassName 会获取用户指定的用于序列化与反序列化的类,通过指定 --custom-serde-inputs 参数,从而构建真正的 Schema。
case NONE: return (Schema<T>) Schema.BYTES;
case AUTO_CONSUME:case AUTO: return (Schema<T>) Schema.AUTO_CONSUME();
case STRING: return (Schema<T>) Schema.STRING;
case AVRO: return AvroSchema.of(SchemaDefinition.<T>builder().withPojo(clazz).build());
case JSON: return JSONSchema.of(SchemaDefinition.<T>builder().withPojo(clazz).build());
case KEY_VALUE: return (Schema<T>)Schema.KV_BYTES();
case PROTOBUF: return ProtobufSchema.ofGenericClass(clazz, Collections.emptyMap());}
目前,在 Source 中支持的 Schema 包括以上示例中的 JSONSchema。该 Schema 生成之后,会在 Consumer 上进行初始化加载,用于解析 Producer 中发出的数据。

>>> Sink 中的 Schema <<<

在 Sink 中,Schema 的使用流程与原理同上,在此就不再赘述。


Schema 帮助保留了数据的元信息,Source 和 Sink 作为与外部系统集成的组件,对 Schema 的良好的支持具有重要的意义。

如果你还想了解更多关于 Pulsar 的知识,欢迎周六来现场。听更多关于 Pulsar 的相关干货~

扫码报名即可👇🏻

同时,如果你对「Pulsar 直播」感兴趣,也可以填写我们的一分钟调查问卷,告诉我们你的想法💡

✍️
Pulsar 直播 :想听什么,您说了算!

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存